package net.ib.mtalk.ui.attachment.scribble;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import net.ib.mtalk.R;
import net.ib.mtalk.base.BaseActivity;
import net.ib.mtalk.constant.MTalkConstant;
import net.ib.mtalk.util.ColorPickerDialog;
import net.ib.mtalk.util.MTalkLogWriter;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;

public class ScribbleActivity extends BaseActivity implements ColorPickerDialog.OnColorSelectedListener {

	ScribbleView mScribbleView;
	ImageButton backwardButton;
	ImageButton forwardButton;
	ImageButton drawButton;
	ImageButton eraseButton;
	ImageButton colorButton;
	ImageButton doneButton;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.layout_scribble);
		mScribbleView = (ScribbleView)findViewById(R.id.draw_area);
		//mScribbleView.setBackgroundBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.android));

		makeControls();
		changeModeDraw();
	}

	/**
	 * 그림판에 대한 조작계를 구성한다.
	 */
	protected void makeControls() {
		backwardButton = ((ImageButton)findViewById(R.id.Scribble_backward));
		backwardButton.setOnClickListener(mClickListener);
		backwardButton.setBackgroundColor(Color.BLACK);

		forwardButton = ((ImageButton)findViewById(R.id.Scribble_forward));
		forwardButton.setOnClickListener(mClickListener);
		forwardButton.setBackgroundColor(Color.BLACK);

		drawButton = ((ImageButton)findViewById(R.id.Scribble_draw));
		drawButton.setOnClickListener(mClickListener);
		drawButton.setBackgroundColor(Color.BLACK);

		eraseButton = ((ImageButton)findViewById(R.id.Scribble_erase));
		eraseButton.setOnClickListener(mClickListener);
		eraseButton.setBackgroundColor(Color.BLACK);

		colorButton = ((ImageButton)findViewById(R.id.Scribble_colorpic));
		colorButton.setOnClickListener(mClickListener);
		colorButton.setBackgroundColor(Color.BLACK);

		doneButton = ((ImageButton)findViewById(R.id.Scribble_done));
		doneButton.setOnClickListener(mClickListener);
		doneButton.setBackgroundColor(Color.BLACK);
	}

	Button.OnClickListener mClickListener = new Button.OnClickListener() {
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.Scribble_backward:
				mScribbleView.removeStroke();
				break;
			case R.id.Scribble_forward:
				mScribbleView.recoverStroke();
				break;
			case R.id.Scribble_draw:
				changeModeDraw();
				break;
			case R.id.Scribble_erase:
				changeModeErase();
				break;
			case R.id.Scribble_colorpic:
				showColorSelector();
				break;
			case R.id.Scribble_done:
				submitResult();
				break;
			}
		}
	};

	/**
	 * 그리기를 위한 대기 상태로 이행한다.
	 */
	void changeModeDraw() {
		// 그리기 모드로 들어가고
		mScribbleView.changeModeDraw();
		// 그리기 버튼을 비활성
		drawButton.setAlpha(70);
		drawButton.setClickable(false);
		// 지우기 버튼을 활성
		eraseButton.setAlpha(255);
		eraseButton.setClickable(true);
	}

	/**
	 * 지우기를 위한 대기 상태로 이행한다.
	 */
	void changeModeErase() {
		// 지우기 모드로 들어가고
		mScribbleView.changeModeErase();
		// 지우기 버튼을 비활성
		eraseButton.setAlpha(70);
		eraseButton.setClickable(false);
		// 그리기 버튼을 활성
		drawButton.setAlpha(255);
		drawButton.setClickable(true);
	}

	/**
	 * ColorPickerDialog를 띄워 준다. 현재의 손그림 뷰의 그리기 색상이 바뀐다.
	 */
	void showColorSelector() {
		ColorPickerDialog colorPicker = new ColorPickerDialog(ScribbleActivity.this, this, this, mScribbleView.getStrokeColor());
		colorPicker.setCanceledOnTouchOutside(true);
		colorPicker.show();
	}

	@Override
	public void colorSelected(int color) {
		mScribbleView.setStrokeColor(color);
		changeModeDraw();	// 색상을 선택했으면 그리기 모드로 들어가자.
	}

	/**
	 * 결과를 세팅하고 이 액티비티를 종료한다. 이 액티비티의 호출자에게는 현재의 비트맵이 담긴 인텐트를 반환한다.
	 */
	void submitResult() {
		if (mScribbleView.getNumberOfStroke() > 0) {
			try {
				// 기본 경로에 넣기
				String savedPosition = MediaStore.Images.Media.insertImage(getContentResolver(), mScribbleView.getCurrentBitmap(), MTalkConstant.TAG, "");
				
				/*	파일을 지정된 경로에 만들기
				String savedPosition = readyTargetFilePath();
	
				FileOutputStream out = new FileOutputStream(new File(savedPosition));
				if (! mScribbleView.getCurrentBitmap().compress(Bitmap.CompressFormat.PNG, 90, out)) {
					throw new Exception("File write fail");
				}
				*/
				
				Intent intent = new Intent();
				intent.setData(Uri.parse(savedPosition));
				setResult(RESULT_OK, intent);
			} catch (Exception e) {
				MTalkLogWriter.e(e);
			}
		}
		finish();
	}

	private String readyTargetFilePath() {
		try {
			String state = android.os.Environment.getExternalStorageState();
		    if(!state.equals(android.os.Environment.MEDIA_MOUNTED))  {
		        throw new IOException("SD Card is not mounted.  It is " + state + ".");
		    }
		} catch (IOException e) {
			MTalkLogWriter.e(e);
			return null;
		}
	    
		String path = MTalkConstant.MTALK_PATH + "/scribble";
		File directory = new File(path);
		if(!directory.exists()){
			directory.mkdirs();
		}
		if (!directory.exists() && !directory.mkdirs()) {
			try {
				throw new IOException("Path to file could not be created.");
			} catch (IOException e) {
				MTalkLogWriter.e(e);
			}
		}
		String dateString = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss-SSSZ").format(new Date());
		path += "/mnTalkScribble_" + dateString + ".png";

		return path;
	}

}


